#!/usr/bin/env node

/**
 * 用户端主服务器 - Node.js实现
 * 基于Python Flask应用迁移，与现有管理端集成
 */

import express from 'express';
import path from 'path';
import cors from 'cors';
import helmet from 'helmet';
import rateLimit from 'express-rate-limit';
import compression from 'compression';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const app = express();
const PORT = process.env.USER_CLIENT_PORT || 3002;

// 安全中间件
app.use(helmet({
    contentSecurityPolicy: {
        directives: {
            defaultSrc: ["'self'"],
            styleSrc: ["'self'", "'unsafe-inline'", "https://cdn.bootcdn.net"],
            scriptSrc: ["'self'", "https://cdn.bootcdn.net"],
            imgSrc: ["'self'", "data:", "https:"],
            fontSrc: ["'self'", "https://cdn.bootcdn.net"]
        }
    }
}));

// 速率限制
const limiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15分钟
    max: 100, // 限制每个IP每15分钟最多100个请求
    message: '请求过于频繁，请稍后再试'
});
app.use(limiter);

// 中间件配置
app.use(compression());
app.use(cors({
    origin: process.env.ALLOWED_ORIGINS ? process.env.ALLOWED_ORIGINS.split(',') : ['http://localhost:3000'],
    credentials: true
}));
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true }));

// 静态文件服务 - 修复路径配置
app.use('/static', express.static(path.join(__dirname, 'public'), {
    index: false,
    redirect: false,
    setHeaders: (res, path) => {
        // 设置正确的MIME类型
        if (path.endsWith('.css')) {
            res.setHeader('Content-Type', 'text/css');
        } else if (path.endsWith('.js')) {
            res.setHeader('Content-Type', 'application/javascript');
        }
    }
}));

// 设置模板引擎
import ejs from 'ejs';
app.set('view engine', 'html');
app.engine('html', ejs.renderFile);
app.set('views', path.join(__dirname, 'views'));

// 数据库连接
import { testConnection } from './config/database.js';

// 测试数据库连接（异步，不阻塞启动）
app.use(async (req, res, next) => {
    if (!global.dbConnected) {
        // 异步测试连接，不阻塞请求处理
        testConnection().then(connected => {
            global.dbConnected = connected;
        }).catch(error => {
            console.warn('⚠️ 数据库连接测试失败:', error.message);
        });
    }
    next();
});

// API路由
import productsRouter from './routes/products.js';
import blogRouter from './routes/blog.js';
import subscriptionRouter from './routes/subscription.js';

app.use('/api/products', productsRouter);
app.use('/api/blog', blogRouter);
app.use('/api', subscriptionRouter);

// 页面路由 - 从Python Flask应用迁移
app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, 'views', 'index.html'));
});

app.get('/about', (req, res) => {
    res.sendFile(path.join(__dirname, 'views', 'about.html'));
});

app.get('/products', (req, res) => {
    res.sendFile(path.join(__dirname, 'views', 'products.html'));
});

app.get('/blog', (req, res) => {
    res.sendFile(path.join(__dirname, 'views', 'blog.html'));
});

app.get('/blog/:id', (req, res) => {
    res.sendFile(path.join(__dirname, 'views', 'blog-detail.html'));
});

app.get('/contact', (req, res) => {
    res.sendFile(path.join(__dirname, 'views', 'contact.html'));
});



// 修复Python Flask中的拼写错误路由
app.get('/adout', (req, res) => {
    res.redirect('/about');
});

// 404处理
app.use((req, res) => {
    res.status(404).sendFile(path.join(__dirname, 'views', '404.html'));
});

// 错误处理中间件
app.use((err, req, res, next) => {
    console.error('用户端服务器错误:', err);
    
    // 如果是API请求，返回JSON错误
    if (req.path.startsWith('/api/')) {
        return res.status(500).json({ 
            error: '服务器内部错误',
            message: process.env.NODE_ENV === 'development' ? err.message : '请联系系统管理员'
        });
    }
    
    // 页面请求，返回错误页面
    res.status(500).sendFile(path.join(__dirname, 'views', '500.html'));
});

// 健康检查端点
app.get('/health', (req, res) => {
    res.json({
        status: 'ok',
        timestamp: new Date().toISOString(),
        uptime: process.uptime(),
        memory: process.memoryUsage(),
        database: global.dbConnected ? 'connected' : 'disconnected'
    });
});

// 启动服务器
app.listen(PORT, () => {
    console.log(`🚀 用户端服务器运行在端口 ${PORT}`);
    console.log(`📊 访问地址: http://localhost:${PORT}`);
    console.log(`🔒 安全配置: CORS、Helmet、速率限制已启用`);
    console.log(`💾 数据库: ${process.env.DB_NAME || 'bike_wholesale'}`);
});

export default app;